class SnapshotSandbox {
  constructor() {
    this.proxy = window; // 代理对象，简化处理，直接用 window
    this.modifyPropsMap = {}; // 保存修改过的属性（离开时记录）
    this.active(); // 构造时激活一次
  }

  // 激活沙箱，进入子应用
  active() {
    this.windowSnapshot = {}; // 保存当前全局 window 状态的快照
    for (const prop in window) {
      if (window.hasOwnProperty(prop)) {
        this.windowSnapshot[prop] = window[prop]; // 快照 window 所有自有属性
      }
    }

    // 应用重新进入时，把上一次保存的修改应用回来
    Object.keys(this.modifyPropsMap).forEach(p => {
      window[p] = this.modifyPropsMap[p];
    });
  }

  // 关闭沙箱，离开子应用
  inactive() {
    for (const prop in window) {
      if (window.hasOwnProperty(prop)) {
        // 如果当前属性值和快照时不同，说明是子应用期间修改的
        if (window[prop] !== this.windowSnapshot[prop]) {
          this.modifyPropsMap[prop] = window[prop]; // 记录变更
          window[prop] = this.windowSnapshot[prop]; // 还原回快照值
        }
      }
    }
  }
}
const sandbox = new SnapshotSandbox()

// 模拟子应用运行时修改 window
window.foo = 'hello from app1'
console.log('window.foo:', window.foo) // "hello from app1"

// 离开子应用，恢复快照
sandbox.inactive()
console.log('after inactive:', window.foo) // undefined（或原值）

// 再次进入子应用，自动恢复之前状态
sandbox.active()
console.log('after re-active:', window.foo) // "hello from app1"
